package main

import (
	"fmt"
	"time"
)

func main() {
	practise()
}

func practise() {
	now := time.Now()
	format := now.Format("2006/01/02 15:04:05")
	fmt.Println(format)
	endTime := time.Now()
	sub := endTime.Sub(now)
	fmt.Println(sub)
	fmt.Println(sub / 1000)
}

func goTimeParse() {
	parse, _ := time.Parse("2006/01/02 15:04:05", "2022/10/05 11:25:20")
	fmt.Println(parse.Year())
	parse, _ = time.Parse(time.RFC3339, "2022-10-05T11:25:20+08:00")
	fmt.Println(parse)

	now := time.Now()
	fmt.Println(now)
	shanhaiTime, _ := time.LoadLocation("Asia/Shanghai")
	timeShanhai, _ := time.ParseInLocation("2006/01/02 15:04:05", "2022/10/05 11:25:20", shanhaiTime)
	fmt.Println(timeShanhai)
	fmt.Println(now.Sub(timeShanhai))
}

func formatTime() {
	now := time.Now()

	// 24小时制
	fmt.Println(now.Format("2006-01-02 15:04:05.000"))

	// 12小时制
	fmt.Println(now.Format("2006-01-02 03:04:05.000 PM"))

	// 保留毫秒小数点
	fmt.Println(now.Format("2006-01-02 15:04:05.000"))

	// 不保留毫秒小数点
	fmt.Println(now.Format("2006-01-02 15:04:05"))

	// 时分秒
	fmt.Println(now.Format("15:04:05"))

	// 年月日
	fmt.Println(now.Format("2006-01-02"))
}

func goTick() {
	tick := time.Tick(time.Second)
	for t := range tick {
		fmt.Println(t)
	}
}

func timeOperation() {
	now := time.Now()
	// Add：增加时间
	later := now.Add(time.Hour)
	fmt.Println(later)

	// Sub：计算俩个时间之间的差值，如果超出了 duration 表示的最大值/最小值，将返回最大值/或最小值
	sub := later.Sub(now)
	fmt.Println(sub)

	// Equal：判断俩个时间是否相同，会考虑时区的影响，因此不同时区的标准时间也可以正确比较，本方法和 t==u 不同，这种方法还会比较地点跟时区信息
	equal := later.Equal(now)
	fmt.Println(equal)

	// Before：如果 t 代表的时间点在 u 之前，则返回 true，否则返回false
	before := now.Before(later)
	fmt.Println(before)

	// After：如果 t 代表的时间点在 u 之后，则返回 true，否则返回true
	after := later.After(now)
	fmt.Println(after)
}

func formatTimestamp() {
	// secondsEastOfUTC := int(8 * time.Hour.Seconds())
	// beijing := time.FixedZone("beijing Time", secondsEastOfUTC)
	beijingTime := time.Date(2022, 11, 18, 9, 30, 0, 100000002, time.Local)

	seconds := beijingTime.Unix()
	milli := beijingTime.UnixMilli()
	micro := beijingTime.UnixMicro()

	timeObj := time.Unix(seconds, 100000002)
	fmt.Println(timeObj)
	unixMilli := time.UnixMilli(milli)
	fmt.Println(unixMilli)
	unixMicro := time.UnixMicro(micro)
	fmt.Println(unixMicro)
}

func timestamp() {
	now := time.Now()            // 获取当前时间
	fmt.Println(now.Unix())      // 秒级时间戳
	fmt.Println(now.UnixMilli()) // 毫秒级时间戳 Go1.17+
	fmt.Println(now.UnixMicro()) // 微秒级时间戳 Go1.17+
	fmt.Println(now.UnixNano())  // 纳秒级时间戳

}

func timezone() {
	// 中国没有夏令时，使用一个固定的8小时的UTC时差
	// 对于其他很多国家需要考虑夏令时
	secondsEastOfUTC := int(8 * time.Hour.Seconds())
	beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)

	// 如果当前系统有时区数据库，则可以加载一个位置得到对应的时区
	new_york, _ := time.LoadLocation("America/New_York")

	// 创建时间对象需要指定位置，常用的位置是 time.Local(当地时间)和 time.UTC(格林尼治时间)
	timeUtc := time.Date(2022, 11, 17, 8, 25, 1, 0, time.UTC)
	timeNewYork := time.Date(2022, 11, 17, 3, 25, 1, 0, new_york)
	timeBeijing := time.Date(2022, 11, 17, 16, 25, 1, 0, beijing)

	// 纽约（西五区）比UTC晚5小时，所以上面两个时间看似差了5小时，但表示的是同一个时间
	equal := timeUtc.Equal(timeNewYork)
	fmt.Println(equal) // true

	// 北京时间（东八区）比UTC早8小时，所以上面两个时间看似差了8小时，但表示的是同一个时间
	equal = timeUtc.Equal(timeBeijing)
	fmt.Println(equal) // true
}

func goNowTime() {
	now := time.Now()
	fmt.Printf("now_time:%+v\n", now)
	fmt.Printf("年：%d\n", now.Year())
	fmt.Printf("月：%d\n", now.Month())
	fmt.Printf("日：%d\n", now.Day())
	fmt.Printf("时：%d\n", now.Hour())
	fmt.Printf("分：%d\n", now.Minute())
	fmt.Printf("秒：%d\n", now.Second())
}
